Parsing with Boost.Spirit

도메인 특화 언어(DSL; SQL, CSS, Make 등)나 프로그래밍 언어를 만드는 경우 파서를 바닥부터 구현하는 것은
매우 복잡하고 어렵다.
Boost.Spirit은 파서를 만드는데 도움을 주는 라이브러리이다.
파서를 생성할 수 있는 간결한 API를 제공한다.
(Boost.Spirit은 렉서와 파서를 명시적으로 구분하지 않으며,
 정의한 타입의 객체에 어떻게 매핑되는지 정의하는 방식으로 사용한다.)
추상 구문 트리(Abstract Syntax Tree, AST)
방문자 디자인 패턴을 지원하는 베이스 클래스를 만든다.(트리 구조의 순회에 사용)
struct ast_element{
virtual ~ast_element()= default;
virtual void accept(ast_element_visitor& visitor)= 0;
};
struct property: ast_element{
vector<wstring> names;
type_specification type;
bool is_constant{ false };
wsting default_value;
void accept(ast_element_visitor& visitor) override {
visitor.visit(*this);
}
};
Boost.Fusion은 또 다른 Boost 라이브러리로
컴파일 타임 합성(메타-프로그래밍)과 런타임 알고리즘을 지원한다.
BOOST_FUSION_ADAPT_STRUCT(
tl n::property,
(std::vector<std::wsting>, names),
(tl n::type_specification, type),
(bool, is_constant),
(std::wsting, default_value)
)
// variant
typedef variant<function_body, property, function_signature> class_member;